<?php

if ( !function_exists('hash_hmac') ):
function hash_hmac($algo, $data, $key, $raw_output = false) {
	return _hash_hmac($algo, $data, $key, $raw_output);
}
endif;

function _hash_hmac($algo, $data, $key, $raw_output = false) {
	$packs = array('md5' => 'H32', 'sha1' => 'H40');

	if ( !isset($packs[$algo]) )
		return false;

	$pack = $packs[$algo];

	if (strlen($key) > 64) 
		$key = pack($pack, $algo($key));

	$key = str_pad($key, 64, chr(0));

	$ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64));
	$opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64));

	$hmac = $algo($opad . pack($pack, $algo($ipad . $data)));

	if ( $raw_output )
		return pack( $pack, $hmac );
	return $hmac;
}


/**
 * java hashcode
 */
function hashcode($input) {
	$MAX_VALUE = 0xffffffff;
	$hashvalue = 0;
	$len = strlen($input);
	for ($i = 0; $i < $len; $i++) {
		$hashvalue = IntVal32(31 * $hashvalue + ord($input{$i}));
	}
	if ($hashvalue < 0)
		return IntVal32( $MAX_VALUE + $hashvalue + 1);
	else
		return $hashvalue;
}

function IntVal32($i){
	if($i>=2147483648 || $i<=-2147483648){
		$i=$i-floor($i/4294967296)*4294967296 ;
		if($i>=2147483648){
			$k=$i-2147483648 ;
			$i=(-2147483648+$k);
		}
	}
	return $i ;
}

/**
 * 返回自然时间表达方式
 *@ return string
 */
function natureTime($date){
	$ret = "";
	$currentTime = time();
	$interval = $currentTime - strtotime($date);
	if($interval < 60){
		$ret = $interval."秒以前";
	}else if(60 < $interval && $interval < 3600){
		$ret = intval( $interval/60 )."分钟以前";
	}else if( 3600 <= $interval && $interval < 86400){
		$ret = intval( $interval/3600 )."小时以前";
	}else if( 86400 <= $interval && $interval < 604800 ){
		$ret = intval( $interval/86400 )."天以前";
	}else if( 604800 <= $interval && $interval < 2592000 ){
		$ret = intval( $interval/604800 )."月以前";
	}else if( 2592000 <= $interval && $interval < 31536000 ){
		$ret = intval( $interval/2592000 )."年以前";
	}
	return $ret;
}
